#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct thing {
    int v;
    int w;
};
thing things[1000];
struct object {
    int v;
    int w;
    int cnt;
};
int main() {
    int n,m;
    cin>>n>>m;
    object ob[n];
    for (int i=0; i<n; i++) {
        scanf("%d%d%d", &ob[i].w, &ob[i].v, &ob[i].cnt);
    }
    int k=0;
    int z;
    for (int i=0; i<n; i++) {
        z=1;
        while (ob[i].cnt>z) {
            things[k].w=z*ob[i].w;
            things[k].v=z*ob[i].v;
            k++;
            ob[i].cnt-=z;
            z=z*2;
        }
        if (ob[i].cnt>0) {
            z=ob[i].cnt;
            things[k].w=z*ob[i].w;
            things[k].v=z*ob[i].v;
            k++;
        }
    }
    int dp[m+1];
    memset(dp, 0, sizeof(dp));
    for (int i=0; i<k; i++) {
        for (int j=m; j>0; j--) {
            if (j-things[i].w>=0 && dp[j-things[i].w]+things[i].v>dp[j]) {
                dp[j]=dp[j-things[i].w]+things[i].v;
            }
        }
    }
    cout<<dp[m]<<endl;
    return 0;
}
